Werte per RFC importieren

Hier zeigen wir Ihnen, wie Sie mithilfe eines Excel-Makros auf ein R/3-System zugreifen und das Ergebnis in Excel speichern können. Der Zugriff erfolgt durch einen “Remote Function Call”. Verwendete Funktionsbausteine müssen RFC-fähig sein.

Legen Sie folgende Makros an und führen Sie das Makro “Start” aus. Die Tabelle T001 “Buchungskreise” wird dann aus dem angegebenen System gelesen und in Excel ausgegeben.

In diesem Fall wird der Funktionsbaustein RFC_READ_TABLE verwendet, um eine Datenbanktabelle auszulesen.

In den Kommentaren stehen noch hilfreiche Hinweise.

SAP-Doku “Using OCX Controls – Chapter 2”

Hier gibt es die Excel-Datei (Format “XLSM”).

Danke an tron! 😉

‘***********************************
‘ Allgemeine SAP Objekte
‘***********************************
Public oConSMD As Object
Public FuncSMD As Object
Public oLogSMD As Object
Public SMDFunctions As Object
‘***********************************
‘ Objekte für RFC_READ_TABLE
‘***********************************
Public SMDFunc As Object
Public SMDTabObj As Object
Public LOGSSMD As Integer
Public SMDdata() As String

Public Sub Logon()

Rem *** Create the Logon Control
Set oLogSMD = CreateObject(“SAP.Logoncontrol.1”)
Rem *** Get a connection object
Set oConSMD = oLogSMD.NewConnection
Rem *** Either all parameters are set by the design environment
Rem *** (except the password) or they are hardcoded,as in the following
Rem *** lines. The following lines depend on your R/3 environment
Rem *** These are the system parameters

oConSMD.System = “DEV” ‘Name of your R/3 System
oConSMD.ApplicationServer = “sldevt10” ‘ApplicationServer of your R/3 System
oConSMD.SystemNumber = 0 ‘SystemNumber of your R/3 System
Rem ***User specific data
oConSMD.User = “TRICKTRESOR”
oConSMD.Password = “Trick17”
oConSMD.Client = “100”
oConSMD.Language = “DE”

Rem ***Try to connect to the R/3 System
If oConSMD.Logon(0, True) = False Then
    MsgBox “R/3 connection failed”
 LOGSSMD = 0
Exit Sub
End If

LOGSSMD = 1
Set SMDFunctions = CreateObject(“SAP.Functions”)
‘Log on to the R/3 System.
Set SMDFunctions.Connection = oConSMD
Set SMDFunc = SMDFunctions.Add(“RFC_READ_TABLE”)

End Sub

Public Sub LogoffSMD()

  If LOGSSMD = 1 Then oConSMD. Logoff

End Sub


Sub SMDRead_Table(Table As String)

Dim T() As String
Dim i As Long
Dim k As Long

SMDFunc.Exports(“DELIMITER”) = vbTab
‘SMDFunc.Exports(“NO_DATA”) = “X”
SMDFunc.Exports(“QUERY_TABLE”) = Table
‘SMDFunc.Exports(“ROWCOUNT”) = “500”

‘******** Create Table Object ************
Set SMDTabObj = SMDFunc.Tables(“FIELDS”)
SMDTabObj.freetable

‘SMDTabObj.appendrow
‘SMDTabObj.appendrow
‘SMDTabObj.cell(1, 1) = “CHECKTABLE”
‘SMDTabObj.cell(2, 1) = “KEYFLAG”

‘******** Create Table Object ************
Set SMDTabObj = SMDFunc.Tables(“OPTIONS”)
SMDTabObj.freetable
‘SMDTabObj.appendrow
‘SMDTabObj.cell(1, 1) = “TABNAME EQ ‘” & Tab_Nam & “‘ AND LENG NE 0”

‘******** Create Table Object ************
Set SMDTabObj = SMDFunc.Tables(“DATA”)

‘******** CLear Table ************
SMDTabObj.freetable

If SMDFunc.Call = True Then
‘******** Read Result ************
T = Split(SMDTabObj.cell(1, 1), vbTab)

ReDim SMDdata(SMDTabObj.Rows.Count, UBound(T))

k = 0
For Each element In SMDTabObj.Rows
    T = Split(element(“WA”), vbTab)
    For i = 0 To UBound(T)
     SMDdata(k, UBound(T) – i) = T(i)
    Next i
    k = k + 1
Next element

Else
    MsgBox SMDFunc.Exception
End If

‘*** ohne Mandant
ReDim Preserve SMDdata(SMDTabObj.Rows.Count, UBound(T) – 1)

End Sub

Sub Start()

Dim i As Long
Dim k As Long

Sheets(1).Select

Logon

SMDRead_Table (“T001”)

For i = 0 To UBound(SMDdata, 1)
    For k = 0 To UBound(SMDdata, 2)
        Cells(i + 1, UBound(SMDdata, 2) – k + 1).Value = SMDdata(i, k)
Next k, i

LogoffSMD

End Sub

Verbesserungsvorschläge

1.)  Die Methoden Logon und LogoffSMD auf von “Public” auf “Private” setzen – dann tauchen Sie nicht in der Makroliste auf
 
2.)  Die Kennworteingabe ist ja immer problematisch.  Ersetzen Sie die die folgende Zeile

If oConSMD.Logon(0, True) = False Then

durch

If oConSMD.Logon(0, False) = False Then

Dann kommt ein Popup angehüpft, in welchem man die Logondaten  (User, Kennwort, System, Mandant, … – alles vorbelegbar aus dem VBA heraus) eingeben kann.
 
3.)  Wenn der Logon fehlschlägt wird zwar eine MsgBox gesendet – aber es wird trotzdem versucht die Daten zu lesen und dabei kommte es dann zu einem Dump.  Es sollte noch getestet werden ob das Objekt überhaupt angelegt werden konnte.

Enno Wulff